#include <sw/redis++/redis.h>
#include <iostream>
#include <string>

namespace chatroom
{
    class RedisClientFactory{
        public:
            static shared_ptr<sw::redis::Redis> create(
                const std::string& host,
                int port,
                int db,
                bool keep_alive)
            {
                //连接服务器
                sw::redis::ConnectionOptions opts;
                opts.host = host;
                opts.port = port;
                opts.db = db;
                opts.keep_alive = keep_alive;
                return std::make_shared<sw::redis::Redis>(opts);
            }
    };
    //会话管理
    class session{
        public:
            using Ptr = std::shared_ptr<session>;
            session(std::shared_ptr<sw::redis::Redis>& redis_client):_redis_client(redis_client){}
            //会话的插入 查询 删除
            void append(const std::string& session_id,const std::string& uid)
            {
                _redis_client->set(session_id,uid);
            }
            void remove(const std::string& session_id)
            {
                _redis_client->del(session_id);
            }
            sw::redis::OptionalString uid(const std::string& session_id)
            {
                return _redis_client->get(session_id);
            }

        private:
            std::shared_ptr<sw::redis::Redis> _redis_client;
    };
    //登录状态管理
    class Status{
        //用户ID与空键值对的操作来判断是否进行了登录
        public:
            using Ptr = std::shared_ptr<Status>;
            Status(std::shared_ptr<sw::redis::Redis>& redis_client):_redis_client(redis_client){}
            //增加 删除 判断是否存在
            void append(const std::string& uid)
            {
                _redis_client->set(uid,"");
            }
            void remove(const std::string& uid)
            {
                _redis_client->del(uid);
            }
            bool exist(const std::string& uid)
            {
                auto res = _redis_client->get(uid);
                if(!res)return false;
                return true;
            }
        private:
            std::shared_ptr<sw::redis::Redis> _redis_client;
    };
    //验证码管理
    class Code{
        public:
            using Ptr = std::shared_ptr<Code>;
            Code(std::shared_ptr<sw::redis::Redis>& redis_client):_redis_client(redis_client){}
            //验证码ID-验证码新增 删除 
            void append(const std::string& cid,const std::string& code,const std::chrono::milliseconds& t = std::chrono::milliseconds(3000))
            {
                _redis_client->set(cid,code);
            }
            void remove(const std::string& cid)
            {
                _redis_client->del(cid);
            }
            sw::redis::OptionalString cid(const std::string& cid)
            {
                return _redis_client->get(cid);
            }
        private:
            std::shared_ptr<sw::redis::Redis> _redis_client;
    };
}